package com.yserp.common.utils.mybatis;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.yserp.project.erp.common.anno.MybatisLikeSearch;
import com.yserp.project.erp.common.anno.MybatisSortedSearch;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Field;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author carl
 * @date 2022年07月22日 16:14
 */
public class MybatisPlusUtil {
    private static Pattern humpPattern = Pattern.compile("[A-Z]");

    public static <T> void notNullField(T T, QueryWrapper<T> wrapper) {
        for (Field field : T.getClass().getDeclaredFields()) {
            field.setAccessible(true);
            try {
                //序列化 字段不需要查询
                if ("serialVersionUID".equals(field.getName())) {
                    continue;
                }
                //对查询参数为空，自动过滤
                if (ObjectUtils.isEmpty(field.get(T))) {
                    continue;
                }

                //主键 注解TableId
                TableId tableId = field.getAnnotation(TableId.class);
                if (tableId != null) {
                    //主键
                    wrapper.eq(tableId.value(), field.get(T));
                    continue;
                }
                //特殊字段特殊处理,模糊查询处理
                MybatisLikeSearch likeSearch = field.getAnnotation(MybatisLikeSearch.class);
                if (likeSearch != null) {
                    String fieldKey=likeSearch.value();
                    if(StringUtils.isBlank(fieldKey)){
                        fieldKey=humpToLine(field.getName());
                    }
                    wrapper.like(fieldKey, field.get(T));
                    continue;
                }
                //数据库中字段名和实体类属性不一致 注解TableField
                TableField tableField = field.getAnnotation(TableField.class);
                if (tableField != null) {
                    if (tableField.exist()) {
                        wrapper.eq(tableField.value(), field.get(T));
                    }// @TableField(exist = false) 不是表中内容 不形成查询条件
                    continue;
                }

                //数据库中字段名和实体类属性一致
                wrapper.eq(humpToLine(field.getName()), field.get(T));
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }

        //排序处理
        sortSearch(T,wrapper);

    }

    public static <T> void sortSearch(T T, QueryWrapper<T> wrapper) {
        for (Field field : T.getClass().getSuperclass().getDeclaredFields()) {
            field.setAccessible(true);
            //特殊字段特殊处理,排序处理
            MybatisSortedSearch mybatisSortedSearch = field.getAnnotation(MybatisSortedSearch.class);
            if (mybatisSortedSearch != null) {
                String fieldKey=mybatisSortedSearch.value();
                if(StringUtils.isBlank(fieldKey)){
                    fieldKey=humpToLine(field.getName());
                }
                wrapper.orderByDesc(fieldKey);
                continue;
            }
        }
    }

    public static String humpToLine(String str) {
        Matcher matcher = humpPattern.matcher(str);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
        }
        matcher.appendTail(sb);
        return sb.toString();
    }
}
